package venta;

import static org.junit.Assert.*;

import java.util.HashMap;
import java.util.Map;

import org.junit.Before;
import org.junit.Test;

import clientes.Cliente;
import static org.mockito.Mockito.*;
import productos.Presentacion;

/**
 * Test de la clase Venta y sus metodos
 * 
 * @author NazarenoCastro
 * 
 */
public class TestVenta {

	Venta venta;
	Map<Presentacion, Integer> productosComprados;

	Cliente clienteCualquiera;

	@Before
	public void setUp() throws Exception {

		productosComprados = new HashMap<Presentacion, Integer>();
	}

	@Test
	public void testLosProductosSeGuardanCorrectamente() {

		venta = new Venta(productosComprados);
		assertEquals(productosComprados, venta.productos());

	}

	

	@Test
	public void testCrearUnaVentaSinPresentacionesEIrAgregandolePresentacionesYMontos() {

		Presentacion presentacion1 = mock(Presentacion.class);
		Presentacion presentacion2 = mock(Presentacion.class);
		when(presentacion1.precioParaConsumidor()).thenReturn(3.23D);
		when(presentacion2.precioParaConsumidor()).thenReturn(7.1D);

		venta = new Venta();
		venta.agregarProductos(presentacion1, 3);
		venta.agregarProductos(presentacion2, 3);

		Double montoEsperado = (3 * (3.23D)) + (3 * (7.1D));

		assertEquals(montoEsperado, venta.monto());

	}


	@Test
	public void testSiLaVentaEstaConformadaPorUnPorductoEnParticularYYoLePreguntoSiLoTieneMeDevuelveTrue() {

		Presentacion producto = mock(Presentacion.class);

		when(producto.id()).thenReturn("10");

		productosComprados.put(producto, 2);

		venta = new Venta(productosComprados);

		assertTrue(venta.registraProducto(producto));

	}

	@Test
	public void testCorroboroQueLaVentaEnviaASuColeccionElMensajeSiSePuedenResolverElStock() {

		Presentacion producto = mock(Presentacion.class);
		when(producto.stockDisponible(10)).thenReturn(true);
		productosComprados.put(producto, 10);

		venta = new Venta(productosComprados);

		Boolean sePuedeComprar = venta.corroborarDisponibilidadDeStock();

		assertTrue(sePuedeComprar);
	}

}
